package la.iok.hzsvn.lewin.movie.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.entity.PlayRoleBook;
import la.iok.hzsvn.lewin.movie.model.PlayRoleBookVo;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

public interface PlayRoleBookService extends BaseService<PlayRoleBook,Long> {
    /**
     * 删除记录
     * @param token 操作用户
     * @param id 电子书id
     */
    void delete(@NotNull Token token, @NotNull Long id);

    /**
     * 删除章节及章节所有角色已经配置的电子书文件
     * @param token 操作用户
     * @param chapterId 章节id
     */
    void deleteChapter(@NotNull Token token,@NotNull Long chapterId);

    /**
     * 上传角色电子书文件
     * @param token 操作用户
     * @param playRoleId 角色id
     * @param chapterId 章节id
     * @param path 文件在pc上的存储路径,相对于剧本根目录
     * @param file 文件.如果是上传到对象存储服务器了,这里就是null
     */
    Long uploadFile(@NotNull Token token, @NotNull Long playRoleId,Long chapterId, @NotNull String path, @Nullable MultipartFile file);

    /**
     * 下载角色电子书文件
     * @param token 操作用户
     * @param response 响应
     * @param id 角色电子书记录id
     */
    void downloadFile(@NotNull Token token, @NotNull HttpServletResponse response, @NotNull Long id);

    /**
     * 查找角色电子书文件摘要
     * @param id 角色电子书记录id
     * @return 角色电子书文件摘要信息
     */
    @Nullable
    String digest(@Nullable Long id);

    /**
     * 查找角色电子书存储路径
     * @param id 角色电子书记录id
     * @return 角色电子书文件存储路径
     */
    @Nullable
    String storePath(@Nullable Long id);

    /**
     * 剧本所有角色的电子书记录列表.按角色排序,同一个角色多个章节电子书以sequence从小到大排
     * @param movieId 剧本id
     * @return 剧本所有电子书列表,按角色排序,同一个角色以sequence从小到大排序
     */
    @NotNull
    @NotNullElement
    List<PlayRoleBook> movieRoleBooks(@Nullable Long movieId);

    /**
     * 剧本所有角色的电子书记录列表.按角色排序,同一个角色多个章节电子书以sequence从小到大排
     * @param token 操作用户
     * @param movieId 剧本id
     * @return 剧本所有电子书列表,按角色排序,同一个角色以sequence从小到大排序
     */
    @NotNull
    @NotNullElement
    List<PlayRoleBookVo> movieRoleBooks(@NotNull Token token, @Nullable Long movieId);
}
